﻿#region

using System;

#endregion

namespace KQReport.Utils
{
    public class SysParam<T> // where T:struct
    {
        #region BaseValue

        /// <summary>
        ///     值改变委托
        /// </summary>
        /// <param name="old"></param>
        /// <param name="new"></param>
        public delegate void ValueChangedHandler(T old, T @new);

        private bool _filled;

        /// <summary>
        ///     分类
        /// </summary>
        public string Category { get; private set; }

        /// <summary>
        ///     名称
        /// </summary>
        public string Name { get; private set; }

        /// <summary>
        ///     默认值
        /// </summary>
        public T Default { get; private set; }

        /// <summary>
        ///     值改变事件
        /// </summary>
        public event ValueChangedHandler ValueChanged;

        #endregion

        /// <summary>
        ///     当前值
        /// </summary>
        private T _value;

        public SysParam(string category, string name)
        {
            Category = category;
            Name = name;
        }

        public SysParam(string category, string name, T @default)
        {
            Category = category;
            Name = name;
            Default = @default;
        }

        public Func<T, string> FuncSet { get; set; }
        public Func<string, T> FuncGet { get; set; }

        /// <summary>
        ///     值
        /// </summary>
        public T Value
        {
            get
            {
                if (!_filled)
                {
                    var valueString = IniConfig.Read(Category, Name);
                    if (string.IsNullOrEmpty(valueString))
                        valueString = null;
                    if (FuncGet != null)
                        _value = FuncGet(valueString);
                    else
                    {
                        if (valueString == null)
                            _value = Default;
                        else
                        {
                            try
                            {
                                _value = (T) Convert.ChangeType(valueString, typeof (T));
                            }
                            catch
                            {
                                _value = Default;
                            }
                        }
                    }
                    if (Equals(_value, default(T)))
                        _value = Default;
                    _filled = true;
                }
                return _value;
            }
            set
            {
                //都不为空,且相等
                if (Equals(_value, value)) return; // _value == value
                if (ValueChanged != null)
                    ValueChanged(_value, value);
                _value = value;
                var valueString = FuncSet != null ? FuncSet(value) : value.ToString();
                IniConfig.Write(Category, Name, valueString);
            }
        }
    }
}

//    public class SysParam<string>
//    {
//    }
//
//    /// <summary>
//    ///   ini参数
//    /// </summary>
//    public class ParamsInt
//    {
//        #region BaseValue
//
//        private bool _loadDef;
//        private bool _filled;
//
//        private string _category;
//        private int _default;
//        private string _name;
//
//        /// <summary>
//        ///   分类
//        /// </summary>
//        public string Category
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _category;
//            }
//        }
//
//        /// <summary>
//        ///   名称
//        /// </summary>
//        public string Name
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _name;
//            }
//        }
//
//        /// <summary>
//        ///   默认值
//        /// </summary>
//        public int Default
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _default;
//            }
//        }
//
//        private void LoadDef()
//        {
//            if (_loadDef) return;
//            var def = this.GetDef();
//            if (def == null) return;
//            _category = def.Category;
//            _name = def.Name;
//            _default = def.DefaultInt;
//            _loadDef = true;
//        }
//        
//        /// <summary>
//        /// 值改变委托
//        /// </summary>
//        /// <param name="old"></param>
//        /// <param name="new"></param>
//        public delegate void ValueChangedHandler(int old, int @new);
//        /// <summary>
//        /// 值改变事件
//        /// </summary>
//        public event ValueChangedHandler ValueChanged;
//        #endregion
//
//        /// <summary>
//        ///   当前值
//        /// </summary>
//        private int _value;
//
//        /// <summary>
//        ///   值
//        /// </summary>
//        public int Value
//        {
//            get
//            {
//                if (!_loadDef)
//                    LoadDef();
//                if (!_filled)
//                {
//                    _value = IniConfig.ReadInt(Category, Name, Default);
//                    _filled = true;
//                }
//                return _value;
//            }
//            set
//            {
//                if (!_loadDef)
//                    LoadDef();
//                //都不为空,且相等
//                if (_value == value) return;
//                if (ValueChanged != null)
//                    ValueChanged(_value, value);
//                _value = value;
//                IniConfig.Write(Category, Name, _value);
//            }
//        }
//    }
//
//    /// <summary>
//    ///   ini参数
//    /// </summary>
//    public class ParamsUInt
//    {
//        #region BaseValue
//
//        private bool _loadDef;
//        private bool _filled;
//
//        private string _category;
//        private int _default;
//        private string _name;
//
//        /// <summary>
//        ///   分类
//        /// </summary>
//        public string Category
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _category;
//            }
//        }
//
//        /// <summary>
//        ///   名称
//        /// </summary>
//        public string Name
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _name;
//            }
//        }
//
//        /// <summary>
//        ///   默认值
//        /// </summary>
//        public int Default
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _default;
//            }
//        }
//
//        private void LoadDef()
//        {
//            if (_loadDef) return;
//            var def = this.GetDef();
//            if (def == null) return;
//            _category = def.Category;
//            _name = def.Name;
//            _default = def.DefaultInt;
//            _loadDef = true;
//        }
//        /// <summary>
//        /// 值改变委托
//        /// </summary>
//        /// <param name="old"></param>
//        /// <param name="new"></param>
//        public delegate void ValueChangedHandler(uint old, uint @new);
//        /// <summary>
//        /// 值改变事件
//        /// </summary>
//        public event ValueChangedHandler ValueChanged;
//
//        #endregion
//
//        /// <summary>
//        ///   当前值
//        /// </summary>
//        private uint _value;
//
//        /// <summary>
//        ///   值
//        /// </summary>
//        public uint Value
//        {
//            get
//            {
//                if (!_loadDef)
//                    LoadDef();
//                if (!_filled)
//                {
//                    _value = Convert.ToUInt32(IniConfig.ReadInt(Category, Name, Default));
//                    _filled = true;
//                }
//                return _value;
//            }
//            set
//            {
//                if (!_loadDef)
//                    LoadDef();
//                //都不为空,且相等
//                if (_value == value) return;
//                if (ValueChanged != null)
//                    ValueChanged(_value, value);
//                _value = value;
//                IniConfig.Write(Category, Name, (int) _value);
//            }
//        }
//    }
//
//    /// <summary>
//    ///   ini参数
//    /// </summary>
//    public class ParamsBool
//    {
//        #region BaseValue
//
//        private bool _loadDef;
//        private bool _filled;
//
//        private string _category;
//        private bool _default;
//        private string _name;
//
//        /// <summary>
//        ///   分类
//        /// </summary>
//        public string Category
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _category;
//            }
//        }
//
//        /// <summary>
//        ///   名称
//        /// </summary>
//        public string Name
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _name;
//            }
//        }
//
//        /// <summary>
//        ///   默认值
//        /// </summary>
//        public bool Default
//        {
//            get
//            {
//                if (_loadDef)
//                    LoadDef();
//                return _default;
//            }
//        }
//
//        private void LoadDef()
//        {
//            if (_loadDef) return;
//            var def = this.GetDef();
//            if (def == null) return;
//            _category = def.Category;
//            _name = def.Name;
//            _default = def.DefaultBool;
//            _loadDef = true;
//        }
//
//        #endregion
//
//        /// <summary>
//        ///   当前值
//        /// </summary>
//        private bool _value;
//
//        /// <summary>
//        ///   值
//        /// </summary>
//        public bool Value
//        {
//            get
//            {
//                if (!_loadDef)
//                    LoadDef();
//                if (!_filled)
//                {
//                    _value = IniConfig.ReadBoolean(Category, Name, Default);
//                    _filled = true;
//                }
//                return _value;
//            }
//            set
//            {
//                if (!_loadDef)
//                    LoadDef();
//                //都不为空,且相等
//                if (_value == value) return;
//                if (ValueChanged != null)
//                    ValueChanged(_value, value);
//                _value = value;
//                IniConfig.Write(Category, Name, _value);
//            }
//        }
//        /// <summary>
//        /// 值改变委托
//        /// </summary>
//        /// <param name="old"></param>
//        /// <param name="new"></param>
//        public delegate void ValueChangedHandler(bool old, bool @new);
//        /// <summary>
//        /// 值改变事件
//        /// </summary>
//        public event ValueChangedHandler ValueChanged;
//    }